package com.Humanities.auth.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices;
import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
import org.springframework.security.oauth2.provider.token.TokenEnhancerChain;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.InMemoryTokenStore;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;

import java.util.Arrays;

/**
 * @author Administrator
 * @version 1.0
 **/
@Configuration
public class TokenConfig {
    //你的授权服务器配置 JWT令牌支持

    private String SIGNING_KEY = "mq123";  //用于 JWT 的加解密签名密钥

    @Autowired
    TokenStore tokenStore;

//    @Bean
//    public TokenStore tokenStore() {
//        //使用内存存储令牌（普通令牌）
//        return new InMemoryTokenStore();
//    }

  @Autowired
    private JwtAccessTokenConverter accessTokenConverter; // JWT令牌转换器，用于处理JWT格式的令牌

    @Bean
    public TokenStore tokenStore() {  // 配置令牌存储方式
        return new JwtTokenStore(accessTokenConverter()); // 使用JWT令牌存储实现，需要token转换器来处理令牌
    }

    @Bean
    public JwtAccessTokenConverter accessTokenConverter() { // 配置JWT令牌转换器
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); // 创建JWT令牌转换器实例
        converter.setSigningKey(SIGNING_KEY); // 设置JWT签名密钥，用于令牌的加密和解密
        return converter;
    }

    //令牌管理服务
    @Bean(name="authorizationServerTokenServicesCustom") // 自定jwt令牌服务Bean名称
    //和 AuthorizationServer 中 @Resource(name="authorizationServerTokenServicesCustom") 配置完全匹配 ✔️
    public AuthorizationServerTokenServices tokenService() { // 配置令牌管理服务
        DefaultTokenServices service=new DefaultTokenServices(); // 创建默认的令牌服务实现
        service.setSupportRefreshToken(true); // 启用刷新令牌的支持
        service.setTokenStore(tokenStore); // 设置令牌的存储方式为JWT存储

        TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain(); // 创建令牌增强链
        tokenEnhancerChain.setTokenEnhancers(Arrays.asList(accessTokenConverter)); // 配置JWT转换器作为令牌增强器 用于处理 token 的增强，
        // 比如你后续可以加入自定义 TokenEnhancer 来添加更多信息到 JWT 中（例如用户角色、权限等
        service.setTokenEnhancer(tokenEnhancerChain); // 设置令牌增���链

        service.setAccessTokenValiditySeconds(7200); // 设置访问令牌的有效期为2小时
        service.setRefreshTokenValiditySeconds(259200); // 设置刷新令牌的有效期为3天
        return service;
    }
}